package com.ruoyi.material.service.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.material.vo.MaterialVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.material.mapper.MaterialsMapper;
import com.ruoyi.material.domain.Materials;
import com.ruoyi.material.service.IMaterialsService;

/**
 * 物料管理Service业务层处理
 *
 * @author shanhai
 * @date 2024-09-12
 */
@Service
public class MaterialsServiceImpl implements IMaterialsService {


    @Autowired
    private MaterialsMapper materialsMapper;


    /**
     * 查询物料管理
     *
     * @param id 物料管理主键
     * @return 物料管理
     */
    @Override
    public Materials selectMaterialsById(Long id) {
        return materialsMapper.selectMaterialsById(id);
    }

    /**
     * 查询物料管理列表
     *
     * @param materials 物料管理
     * @return 物料管理
     */
    @Override
    public List<Materials> selectMaterialsList(Materials materials) {
        return materialsMapper.selectMaterialsList(materials);
    }

    /**
     * 新增物料管理
     *
     * @param materials 物料管理
     * @return 结果
     */
    @Override
    public int insertMaterials(Materials materials) {
        materials.setCreateTime(DateUtils.getNowDate());
        // 山海添加  设置创建人
        materials.setCreateBy(SecurityUtils.getUsername());
        return materialsMapper.insertMaterials(materials);
    }

    /**
     * 修改物料管理
     *
     * @param materials 物料管理
     * @return 结果
     */
    @Override
    public int updateMaterials(Materials materials) {
        materials.setUpdateTime(DateUtils.getNowDate());
        // 山海添加  设置修改人
        materials.setUpdateBy(SecurityUtils.getUsername());
        return materialsMapper.updateMaterials(materials);
    }

    /**
     * 批量删除物料管理
     *
     * @param ids 需要删除的物料管理主键
     * @return 结果
     */
    @Override
    public int deleteMaterialsByIds(Long[] ids) {
        return materialsMapper.deleteMaterialsByIds(ids);
    }

    /**
     * 删除物料管理信息
     *
     * @param id 物料管理主键
     * @return 结果
     */
    @Override
    public int deleteMaterialsById(Long id) {
        return materialsMapper.deleteMaterialsById(id);
    }

    /**
     * 处理数据 计算需求量
     *
     * @param materialVoList
     * @return
     */
    @Override
    public List<MaterialVo> dealData(List<MaterialVo> materialVoList) {
        // 1.数据库中 查询数据
        List<MaterialVo> materialsList = materialsMapper.selectMaterialsAll();
        // 将materialsList 转换为 Map <materialVo.materialName,materialVo.quantity >
        Map<String, BigDecimal> materialMap = materialsList.stream()
                .collect(Collectors.toMap(
                        MaterialVo::getMaterialName, // 提取键
                        MaterialVo::getQuantity      // 提取值
                ));
        // 2.构建新集合 存储数据
        List<MaterialVo> newMaterialVoList = new ArrayList<>();
        // 3.遍历导入的数据 materialVoList
        for (MaterialVo materialVo : materialVoList) {
            // 1.判断数据库中是否有 相同的物料名称
            boolean b = materialMap.containsKey(materialVo.getMaterialName());
            if (b) {
                BigDecimal compareNum = materialVo.getQuantity().
                        subtract((materialMap.get(materialVo.getMaterialName())));
                if (compareNum.compareTo(BigDecimal.ZERO) > 0) {
                    newMaterialVoList.add(new MaterialVo(materialVo.getMaterialName(), compareNum,
                            materialVo.getDescription(), materialVo.getMaterialTypeId(), materialVo.getRemark()));
                }// 1.1 有，判断数量，   导入数据 - 数据库中数据
                // 1.2 数据库中数据 < 导入数据，数量 = 导入数据 - 数据库中数据    （计算出缺值） 存入新集合
            } else {// 1.3没有直接添加到新集合
                newMaterialVoList.add(materialVo);
            }
        }
        return newMaterialVoList;
    }
}
